﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MMessaging.RequestResponse.Test.Services;
using MMessaging.Address.Services;
using MMessaging.MessagingEx.Queues;
using TUtils.BasicHelper.Logging;
using TUtils.Multithreading;
using MMessaging.RequestResponse.Test;
using MMessaging.RequestResponse.Test.Common;
using System.Threading;

namespace MMessaging.Address.Test
{
	class Program
	{
		static void Main(string[] args)
		{
			// Switch erzeugen und initialisieren
			var switchNode = new MServiceSwitch();
			switchNode.Init(
				false, // start at once ?
				new MAddress("Switch"));

			const int countOfGuests = 1;

			// Restarant Service erzeugen, initialisieren und starten.
			// Dabei Service implizit mit dem Switch verbinden.
			var restaurantService = new RestaurantService();
			restaurantService.Init(
				"Restaurant",
				switchNode, // mit dem Switch verbinden
				countOfGuests * 3 + 2,
				true);

			// Gast Services erzeugen, initialisieren und starten
			// Dabei implizit mit dem Switch verbinden.
			var guestServices = new List<GuestService>();
			for (int guestNo = 0; guestNo < countOfGuests; guestNo++)
			{
				var guestService = new GuestService(new MAddress("Guest_" + guestNo));
				guestServices.Add(guestService);
				guestService.Init(
					"Gast " + guestNo,
					switchNode,  // mit dem Switch verbinden
					3,
					true);
			}

			// Switch starten
			switchNode.StartAsync(); // erst nachdem die Services angebunden wurden

			// Sleep
			Thread.Sleep(2000);


			// let guest enter
			restaurantService.PostMessage(
				new LetGuestEnter(
					RestaurantGlobals.GuestRole,
					restaurantService.ServiceAddress,
					DateTime.Now));


			// auf Tastendruck warten
			Console.ReadKey();

			ApplicationTerminationEvent.RiseTerminationEvent();
		}
	}
}
